

// es5的原型继承
function Person() {
  this.name="三笠";
  this.age=19;
}
Person.prototype.say = function(){
  console.log(this.name);
}
const Son = function () {
  //对象冒充继承
  Person.call(this);
  this.Features = '吃饭';
}
Son.prototype.mySetName =function(){
  console.log(this.Features);
}

//实例化
let s = new Son();
// console.log(s);
// s.mySetName()




//人类
function MyPerson(name) {
  this.name = name;
  this.showName = function () {
      console.log("my name is " + name);
  }
  this.eat = function () {
      console.log("人是铁饭是钢...");
  }
}
MyPerson.prototype.myhome = function(){
  console.log('我的家');
}
//白人
function WhitePerson(name) {//这里有个问题就是我们传参的时候,这里不知道给白人的类传还是给人类的类
  this.temp = MyPerson;//这里我将人的类保存在属性中
  this.temp(name);//调用时候并传参
  delete this.temp;//删除这个属性
  this.color = function () {
      console.log("我们皮肤是偏白色的");
  }
}
//黑人
function BlackPerson(name) {
  MyPerson.call(this, name);//这个时候Person中的this指向的是BlackPerson的对象了
  this.color = function () {
      console.log("我们皮肤是偏黑色的");
  }
}
var wPreson = new WhitePerson("tom");
wPreson.showName();//my name is tom
//wPreson.myhome()//报错wPreson.myhome is not a function

var bPerson = new BlackPerson("john");
bPerson.showName();//my name is john

/*对象冒充的缺点：new实例化后，对象就在堆内存中形成了自己的空间，值得注意的是，这个代码段。而成员方法就是存在这个代码段的，并且方法是共用的。
问题就在这里，通过对象冒充方式继承时，所有的成员方法都是指向this的，也就是说new之后，每个实例将都会拥有这个成员方法，并不是共用的，这就造成了大量的内存
浪费。并且通过对象冒充的方式，无法继承通过prototype方式定义的变量和方法，所以代码将会出错*/



/*原型链的缺点：原型链方式继承，就是实例化子类时不能将参数传给父类，也就是为什么这个例子中function Person()没有参数，
而是直接写成了this.name=”Simon”的原因*/

//综合方法， 成员变量采用对象冒充方式，成员方法采用原型链方式

//改进之后人的类
function SuperPerson (name) {
  this.name = name;
}
// 原型添加方法
SuperPerson.prototype.say = function () {
  console.log('My name is ' + this.name);
}
// F2E冒充继承
function F2E(name, id) {
  //这里只是继承了this
  SuperPerson.call(this, name);
  this.id = id;
}
//在这里继承改进人类的原型
F2E.prototype = new SuperPerson();

//细节 showId 不能写在F2E.prototype = new Person(); 前面
F2E.prototype.showId = function () {
  console.log('My id is ' + this.id);
}

var simon = new F2E('simon', 9576);
simon.say();//My name is simon
simon.showId();//My id is 9576

